<?php
/**
 *
 * @author Mr.UBKey
 * @package XPHP
 * @version Beta
 * @copyright XWEB
 */

require_once 'XPHP/View/Result/Interface.php';
require_once 'XPHP/View.php';
require_once 'XPHP/View/Helper.php';
require_once 'XPHP/Layout.php';
require_once 'XPHP/Model.php';
require_once 'XPHP/Cache/Frontend.php';
require_once 'XPHP/Layout/Content.php';
require_once 'XPHP/Layout/Section.php';

/**
 * Lớp XPHP_View_Result. Hiển thị View hệ thống
 */
class XPHP_View_Result extends XPHP_View_Result_Abstract
{	
	/**
	 * Tên layout
	 * @var string
	 */
	public $layout;
	
	/**
	 * Lớp hỗ trợ HTML
	 * @var XPHP_Html
	 */
	protected $html;
	
	/**
	 * Lớp hỗ trợ Form
	 * @var XPHP_Form
	 */
	protected $form;
	
	/**
	 * Lớp hỗ trợ URL
	 * @var XPHP_Url
	 */
	protected $url;
	
	/**
	 * Thuộc tính Model. 
	 * Cũng có thể sử dụng $this->_model (Model gốc được thiết lập từ Controller)
	 * @var XPHP_Model
	 */
	public $model;
	
	/**
	 * Lớp hỗ trợ cache frontend
	 * @var XPHP_Cache_Frontend
	 */
	protected $cache;
	
	/**
	 * Lớp xử lý section
	 * @var XPHP_Layout_Section
	 */
	protected $section;
	
	/**
	 * Lớp xử lý content
	 * @var XPHP_Layout_Content
	 */
	protected $content;
	
	/**
	 * Lớp hỗ trợ xử lý session
	 * @var XPHP_Session
	 */
	protected $session;
	
	/**
	 * Lớp hỗ trợ xử lý cookie
	 * @var XPHP_Cookie
	 */
	protected $cookie;
	
	/**
	 * Xử lý resource
	 * @var XPHP_Resource
	 */
	protected $resource;
	
	/**
	 * Lớp hỗ trợ xử lý Asset
	 * @var XPHP_Asset
	 */
	protected $asset;
	
	/**
	 * (non-PHPdoc)
	 * @see XPHP_View_Result_Interface::ExecuteResult()
	 */
	public function ExecuteResult()
	{
		//Lấy layout được thiết lập từ Controller 
		$this->layout = $this->_layout->getLayoutFile();
		
		//Gán giá trị từ $this->_model tới $this->model
		//$this->model có thể thay đổi khi người dùng set trong file view
		$this->model = $this->_model;
		
		//Lấy các giá trị từ view dynamic data đưa vào
		require_once 'XPHP/Reflection.php';
		$ref = new XPHP_Reflection($this->_view->getViewData());
			
		//foreach ($this->_view->getViewData() as $var => $value)
			//$this->$var = $value;
		extract( get_object_vars($this->_view->getViewData()), EXTR_OVERWRITE);

		//Lớp Helper
		$this->_helper = new XPHP_View_Helper($this->_view->getRouter());
		
		//Lớp hỗ trợ xử lý Session
		$this->session = XPHP_Session::getInstance();
		
		//Lớp hỗ trợ xử lý Cookie
		$this->cookie = new XPHP_Cookie();
		
		//Lớp hỗ trợ xử lý HTML
		$this->html = new XPHP_Html($this->_view->getRouter(), $this);
		
		//Lớp hỗ trợ xử lý Form
		$this->form = new XPHP_Form($this->_view->getRouter(), $this);
		
		//Lớp hỗ trợ URL
		$this->url = new XPHP_Url($this->_view->getRouter());
		
		//Lớp hỗ trợ Asset
		$this->asset = new XPHP_Asset($this->url);
		
		//Xử lý resource
		if(XPHP_Registry::isRegistered("DefaultResource"))
			$this->resource = XPHP_Registry::get("DefaultResource");
			
		//Khởi tạo lớp xử lý Section Layout
		$this->section = new XPHP_Layout_Section();
		
		//Khởi tạo lớp xử lý Content Layout
		$this->content = new XPHP_Layout_Content();
		
		//Khởi tạo lớp hỗ trợ cache phía frontend
		$this->cache = new XPHP_Cache_Frontend();
		
		//Load các helper hỗ trợ View Result
		$this->_loadViewResultHelper();
		
		/*
		 * Include file View
		 * Nếu có định nghĩa section, content, layout thì load layout
		 * Nếu không thì hiển thị view
		 */
		require_once $this->_view->getDefaultViewPath();
		
		if($this->layout !== NULL)
		{
		    //Xóa toàn bộ các hiển thị từ file view
		    ob_end_clean();
		    //Thiết lập file layout
			$this->_layout->setLayoutFile($this->layout);
			//Include file layout
			require_once $this->_layout->getLayoutPath();
		}
	}
}